﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ESpace;
using System.Drawing;

namespace Organizer
{
    public class DirUnit : VisibleUnit
    {
        public override string Ext { get { return ""; } }
        public override string MenuName { get { return "каталог"; } }

        public override Element LoadElement(EStream st, DBItem Parent) { return new DIR(st, Parent); }
        public override Element CreateElementBySourceDate(string Name, DBItem Parent, string SourceData) { return new DIR(Name, Parent, NetStatus.Local); }

        public DirUnit(API_Funtions ExtFunc) : base(ExtFunc) { ; }

        protected override List<Bitmap> GetIcoList()
        {
            List<Bitmap> bmpL = new List<Bitmap>();
            bmpL.Add(Properties.Resources.folder);
            bmpL.Add(Properties.Resources.folder_L);
            bmpL.Add(Properties.Resources.folder_ok);
            bmpL.Add(Properties.Resources.folder_U);
            return bmpL;
        }

        public override int GetNumIco(Element el)
        {
            switch (el.NetStat)
            {
                case NetStatus.Local: return icoIndL[0];
                case NetStatus.NotActual: return icoIndL[1];
                case NetStatus.Write: return icoIndL[3];
                case NetStatus.Actual: return (Gl.IsActualFlag ? icoIndL[2] : icoIndL[1]);
            }
            return -1;
        }
        
        DIR editParent = null;
        Element editEl = null;
        public override Element CreateNew(DIR Parent, NetStatus NetStat)
        {
            DIR ret = null;
            editParent = Parent;
            editEl = null;
            FormEditValue frmEdit = new FormEditValue();
            if (frmEdit.ShowDialog("Добавление каталога", "", false, new FormEditValue.CheckRetValDelegate(CheckRetVal)))
            {
                ret = new DIR(frmEdit.RetVal.Trim(), Parent, NetStat);
            }

            editParent = null;
            editEl = null;
            frmEdit.Dispose(); frmEdit = null;

            return ret;
        }

        public override bool Edit(Element EditEl)
        {
            return false;
        }

        protected string CheckRetVal(string RetVal)
        {
            if (editParent == null) return "";
            // если добавление
            if (editEl == null)
            {
                // проверка имени на запрещенность
                string err = Gl.CheckName(editParent, null, RetVal.Trim());
                if (err != "") return err;

                // проверка имени на совпадение с системными каталогами

            }
            return "";
        }

        public override void TimerTick(DateTime tmrDt, DIR DB) { ;}

        /// <summary> событие изменения режима гости </summary>
        public override void GuestModeChange(bool bGuest) { ;}

        /// <summary> событие возникает после загрузки базы. Сам юнит создается до загрузки базы
        /// событие используется для выполнения начальных дейтсвий с уже загруженой базой </summary>
        public override void EndCreate() { ;}

    }

    /// <summary>
    ///  каталог (особый вид элемента, у которого синхронизируется только вложенное)
    ///  Другие элементы тоже могут содержать вложенные элементы, но при синхронизации заменяются полностью в отдличии от DIR
    /// </summary>
    public class DIR : Element
    {
        int ActVer = 0;

        public bool IsSystemDir = false; // каталог является системным (не может переименовываться или перемещаться. Обязателдьно должен находиться в корне базы данных)

        public override string Ext { get { return ""; } }

        public override string SourceData
        {
            get
            {
                return "";
            }
            set
            {
                ;
            }
        }

        public bool IsHide = false; // скрытый. Не отображается

        //public DIR(DIR Parent, NetStatus NetStat) : base(Parent, NetStat) { }

        public DIR(string Name, DBItem Parent, NetStatus NetStat) : base(Name, true, Parent, NetStat) { }

        public DIR(EStream st, DBItem Parent)
            : base(st, Parent)
        {
            int LoadVer = st.LoadInt();
            switch (LoadVer)
            {
                case 0: Load0(st); break;
                default: throw new Exception("Невозможно загрузить элемент, так как версия не поддерживается");
            }
        }

        public override void Dispose() { ; }

        void Load0(EStream st)
        {
            IsSystemDir = st.LoadBool();
            IsHide = st.LoadBool();
        }

        public override void Save(EStream st)
        {
            base.Save(st);
            st.SaveInt(ActVer);

            st.SaveBool(IsSystemDir);
            st.SaveBool(IsHide);
        }

        /* protected override string Create(DIR Parent)
         {
             FormEditValue frmEdit = new FormEditValue();
             if (frmEdit.ShowDialog("Добавление заметки", "", false, new FormEditValue.CheckRetValDelegate(CheckRetVal)))
             {
                 return frmEdit.RetVal.Trim();
             }
             return "";
         }
         */

        protected string CheckRetVal(string RetVal)
        {
            if (Parent == null) return "";
            if (RetVal.Trim() == "") return "Имя не может быть пустым";
            int ind = Parent.IndexOfRecord(RetVal.Trim(), Ext);
            if (Parent.Items[ind].Name != Name) return "Такое имя уже существует";
            return "";
        }

        public override string GetComment()
        {
            return "<DIR>";
        }

        public override void TimerTick(DateTime tmrDt, DIR DB) { ;}

    }

}
